/*
?  JSON.stringify() 是 JavaScript 中的一个内置函数，用于将 JavaScript 对象转换为 JSON 字符串。以下是 JSON.stringify() 的一些特性：
?  1. 序列化对象：JSON.stringify() 可以将 JavaScript 对象序列化为 JSON 字符串。它会递归地遍历对象的所有属性，并将其转换为对应的 JSON 表示形式。
?  2. 转换基本数据类型：JSON.stringify() 可以将 JavaScript 的基本数据类型（字符串、数字、布尔值、null）转换为对应的 JSON 表示形式。
?  3. 转换数组和对象：JSON.stringify() 可以将 JavaScript 数组和对象转换为 JSON 数组和 JSON 对象的表示形式。
?  4. 过滤属性：可以通过提供一个 replacer 函数或一个属性数组来过滤要序列化的属性。replacer 函数可以控制序列化过程中的属性选择和转换。
?  5. 空格和缩进：可以通过提供一个空格参数来控制生成的 JSON 字符串的格式。可以使用数字指定缩进的空格数，或者使用字符串指定缩进的字符。
?  6. 处理循环引用：JSON.stringify() 默认会处理循环引用，将循环引用的对象转换为字符串 "[Circular]"，以避免无限递归的问题。
?  7. 处理特殊值：JSON.stringify() 可以处理特殊值，如 NaN、Infinity、-Infinity，将它们转换为对应的 JSON 表示形式。
 */
//? 此方法会忽略undefined、Symbol、function，不能正确处理NaN，Infinity，循环引用。
function myJsonSfy(obj) {
    //? 因为字符串需要展示出""
    if (typeof obj === 'string') return `"${obj}"`
    //? 这三个不用展示出""
    if (typeof obj === 'number' || typeof obj === 'boolean' || obj === null) return String(obj)
    if (Array.isArray(obj)) {
        return `[${obj.map(item => myJsonSfy(item)).join(',')}]`
    }
    if (typeof obj === 'object') {
        const keys = Object.keys(obj)
        return `{${keys.map(key => `"${key}":${myJsonSfy(obj[key])}`).join(',')}}`
    }
    return undefined
}

console.log(myJsonSfy(1));
console.log(myJsonSfy([1,2,{a:1}]));
console.log(myJsonSfy({
    a:1,
    b:2,
    c:{
        d:"3"
    }
}));
console.log(JSON.stringify({
    a:1,
    b:2,
    c:{
        d:"3",
        //? 被忽略
        e: undefined
    }
}));
